package com.example.controller.buyer;

import cn.hutool.core.bean.BeanUtil;
import com.example.base.BaseController;
import com.example.entity.*;
import com.example.entity.enums.UserPreferEnum;
import com.example.service.*;
import com.example.service.impl.UserPreferService;
import com.example.util.BeanUtils;
import com.example.vo.IdHolder;
import com.example.vo.Result;
import com.example.vo.SpuItemVo;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

/**
 * @author lsc
 * @date 2024/5/13
 */
@RestController
@Slf4j
@RequestMapping("/spu")
public class SpuController extends BaseController<SpuService,Spu> {

    @Resource
    private SpuAttrValueService spuAttrValueService;

    @Resource
    private SkuService skuService;

    @Resource
    private SkuAttrValueService skuAttrValueService;

    @Resource
    private GoodsCategoryService goodsCategoryService;

    @Resource
    private UserPreferService userPreferService;

    @GetMapping("/getSpuById/{spuId}")
    public Result<SpuVo> getSpuItemById(@PathVariable("spuId") Integer spuId){

        Spu spu = baseService.getById(spuId);

//        SpuVo spuVo = new SpuVo(spu);

        SpuVo spuVo = new SpuVo();

        BeanUtil.copyProperties(spu,spuVo);

        List<SpuAttrValue> spuAttrValueList = spuAttrValueService.getSpuAttrsBySpuId(spuId);

        spuVo.setBaseAttrs(spuAttrValueList);

        List<SkuVo> skus = skuService.getSkusBySpuId(spuId);

        List<Long> skuIds = new ArrayList<>();

        for (SkuVo skuVo : skus) {
            Long skuId = skuVo.getId();

            skuIds.add(skuId);

            skuVo.setSaleAttrs(skuAttrValueService.getSkuAttrsBySkuId(skuId));

            skuVo.setImages(skuService.getSkuImagesById(skuId));
        }

        spuVo.setSkus(skus);

        spuVo.setAllSaleAttrs(skuService.getAllSkuSaleAttrBySkuIds(skuIds));

        //记录浏览偏好
        Long userId = IdHolder.getUserId();
        userPreferService.recordUserScore(userId,spuId.longValue(), UserPreferEnum.CLICK);
        return Result.ok(spuVo);
    }

    @GetMapping("/getSpuByCategoryId/{categoryId}")
    public Result<List<SpuItemVo>> getSpuItemByCategoryId(@PathVariable("categoryId") Integer categoryId){

        List<SpuItemVo> spu = baseService.getSpuItemByCategoryId(categoryId);

        for (SpuItemVo spuItemVo : spu) {
            spuItemVo.setPrice(skuService.getMinPrice(Math.toIntExact(spuItemVo.getId())));

            spuItemVo.setImage(skuService.getDefaultImageBySpuId(Math.toIntExact(spuItemVo.getId())));
        }

        return Result.ok(spu);
    }

    @GetMapping("/getSpuByCategoryName")
    public Result<List<SpuItemVo>> getSpuItemByCategoryName(@RequestParam("name") String name){
        String allName = "全部";

        if(name.equals(allName)){
            return Result.ok();
        }

        Long parentCategoryId = goodsCategoryService.getGoodsCategoryIdByName(name);

        log.info("父分类"+parentCategoryId);

        List<Long> childrenCategoryId = goodsCategoryService.getChildrenByPatent(parentCategoryId);

        log.info("子分类"+childrenCategoryId);

        List<SpuItemVo> spuItems = baseService.getSpuItemByCategoryIdS(childrenCategoryId);

        for (SpuItemVo spuItemVo : spuItems) {
            spuItemVo.setPrice(skuService.getMinPrice(Math.toIntExact(spuItemVo.getId())));

            spuItemVo.setImage(skuService.getDefaultImageBySpuId(Math.toIntExact(spuItemVo.getId())));
        }

        return Result.ok(spuItems);
    }

    @GetMapping("/getSpuItemList")
    public Result <List<SpuItemVo>> getSpuItemList(@RequestParam("keyword") String keyword){
        List<SpuItemVo> spuItemVoList = baseService.getSpuItemList(keyword);

        for (SpuItemVo spuItemVo : spuItemVoList) {
            spuItemVo.setPrice(skuService.getMinPrice(Math.toIntExact(spuItemVo.getId())));

            spuItemVo.setImage(skuService.getDefaultImageBySpuId(Math.toIntExact(spuItemVo.getId())));
        }

        return Result.ok(spuItemVoList);
    }

    @GetMapping("/getSpuList")
    public Result<List<SpuVo>> getSpuList(){
        List<Spu> spu = baseService.list();

        List<SpuVo> spuVo = BeanUtils.copyList(spu,SpuVo.class);

        for (SpuVo vo : spuVo) {
            Integer spuId = vo.getId().intValue();

            List<SpuAttrValue> spuAttrValueList = spuAttrValueService.getSpuAttrsBySpuId(spuId);

            vo.setBaseAttrs(spuAttrValueList);

            List<SkuVo> skus = skuService.getSkusBySpuId(spuId);

            List<Long> skuIds = new ArrayList<>();

            for (SkuVo skuVo : skus) {
                Long skuId = skuVo.getId();

                skuIds.add(skuId);

                skuVo.setSaleAttrs(skuAttrValueService.getSkuAttrsBySkuId(skuId));

                skuVo.setImages(skuService.getSkuImagesById(skuId));
            }

            vo.setSkus(skus);

            vo.setAllSaleAttrs(skuService.getAllSkuSaleAttrBySkuIds(skuIds));

            vo.setSpuImages(skuService.getAllSkusImagesById(skuIds));

            vo.setStoreName(baseService.getSpuStoreNameById(vo.getStoreId()));

            vo.setCategoryName(baseService.getSpuCategoryNameById(vo.getCategoryId()));
        }


        return Result.ok(spuVo);
    }

    @PostMapping("/takeOff")
    public Result<Boolean> takeOff(@RequestParam("spuId") Long spuId){

        int re = baseService.updateStatus(0,spuId);

        return Result.ok(re>0);
    }

    @PostMapping("/putOn")
    public Result<Boolean> putOn(@RequestParam("spuId") Long spuId){

        int re = baseService.updateStatus(1,spuId);

        return Result.ok(re>0);
    }

}
